iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0

javap介紹

javap是jdk工具中自帶的反編譯工具,它是根據class位元組碼檔案,反解析出當前類對應的code區(彙編指令)、本地變量表、異常表和程式碼行偏移量對映表、常量池等重要資訊。不過有些資訊是得透過在編譯(javac)時,指定引數才能輸出。

以下為javap指令使用介紹

javap [option] <classfile>

classfile: 就是你要反編譯的class檔案
option: 放置參數。可在終端機中直接輸數javapjavap -help即可看到有哪些參數可以使用
https://ithelp.ithome.com.tw/upload/images/20210920/20140481DlUNOdeBTY.png

option 介紹

依照參數作用的類型我大致分成三大塊,如下:

-vserion:當前反編譯的jdk版本


-public:僅顯示公共類和成員
-protected:顯示受保護的/公共類和成員
-p -private:顯示所有類和成員
-package:顯示程序包/受保護的/公共類和成員
-sysinfo:顯示正在處理的類的系統訊息(路徑、大小、日期、MD5)
-constants:顯示靜態最終常量


-s:列出內部類型簽名
-l:列出行數和本地變量表
-c:反彙編代碼
-v -vervose:輸出附加訊息


準備一個名為JavapTest.java的檔案,程式碼如下:

package Controller;

public class JavapTest{

  public String publicString;
  protected String protectedString;
  String friendlyString;
  private String privateString;

  public static final String staticString1 = "static final";

  static {
    String staticString2 = "測試";
  }
  {
    String privateString = "javap test";
  }
  private void privateConstructor(){

  }
  int getNum(int x){
    return x+x;
  }
  protected String showProtectedString(){
    return protectedString;
  }
  public void showInfo(){
    int x = 10;
    System.out.println(privateString+x);
  }
}

將其檔案進行編譯,編譯方式請參考Day4-java語言編譯器:javac & 運行工具:java (上)
有了class檔案後,即可加入不同的參數進行查看。

  • 不帶有任何參數時

https://ithelp.ithome.com.tw/upload/images/20210920/20140481kCw2ZXFqm1.png

  • -version

javap -version 

https://ithelp.ithome.com.tw/upload/images/20210920/20140481JQuTbTKkbt.png
其實-version這參數作用指的是當前javap工具的版本,而非該class編譯時的版本,故只要下javap -version即可查看。

  • -public

javap -public JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481vzffDtHJV2.png

  • -protected

javap -protected JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481oHiuk5yNEV.png

  • -p -private

javap -p JavapTest.class

javap -private JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481DgQUcQcFuf.png

  • -package

javap -package JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481t38xZ1LAgm.png

  • -sysinfo

javap -sysinfo JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481BomlxYrhti.png

  • -constants

javap -constants JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481PwDy5rcDbc.png

  • -s

javap -s JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481IR3iveOf3c.png

  • -l

javap -l JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481YsTrnj8AGc.png

  • -c

javap -c JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481TNIpDcDGbt.png

  • -v -verbose

javap -v JavapTest.class

javap -verbose JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/201404817V1mcSDUtB.png
https://ithelp.ithome.com.tw/upload/images/20210920/20140481bJGMsn0HQZ.png
https://ithelp.ithome.com.tw/upload/images/20210920/20140481e1djhGmyIV.png

總結

最常使用到的參數大概只有-l-c-v,不過在使用這些參數時,要特別注意,顯示出來的可能只會有protected以上的級別,若要查看全部的類別時,再多加上-p 參數即可。
例:

javap -l JavaTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481YsTrnj8AGc.png

javap -l -p JavaTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481sSqCxjsWDq.png


上一篇
Day5- Java語言編譯器:javac & 運行工具:java (下)
下一篇
Day7-JDK查看正在運行的Java進程工具:jps
系列文
展開JDK工具的30天應用之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言